package cmd

import (
	"bufio"
	"fmt"
	"github.com/spf13/cobra"
	"net"
)

func init() {
	listenCmd := &cobra.Command{
		Use:   "listen",
		Short: "监听端口",
		Long:  `监听端口...`,
		Run: func(cmd *cobra.Command, args []string) {
			fmt.Println("监听地址:", args)
			if len(args) > 0 {
				fmt.Println("开始监听:", args[0])
				listen(args[0])
			} else {
				fmt.Println("参数不可以为空!")
			}
		},
	}
	rootCmd.AddCommand(listenCmd)
}

func listen(address string) {
	fromlistener, err := net.Listen("tcp", address)
	if err != nil {
		fmt.Println("监听端口错误:", err)
		return
	}
	//因为客户端的链接不止一个，需要一直监听，所以加个死循环
	for {
		// 接受客户端的链接Accept(),这里会阻塞,等待连接
		accept, err := fromlistener.Accept()
		if err != nil {
			fmt.Println("连接错误:", err)
		}
		fmt.Println("获取客户端的IP地址", accept.RemoteAddr().String())
		fmt.Println("连接一次", accept)
		// 连接后要单独开启一个进程,处理连接后的数据
		go processL(accept)
	}
}

// 处理函数
func processL(conn net.Conn) {
	// 如果客户端一直没有断开连接,会一直在这个方法内
	defer conn.Close() // 关闭连接
	for {
		reader := bufio.NewReader(conn)
		var buf [128]byte
		n, err := reader.Read(buf[:]) // 读取数据
		if err != nil {
			fmt.Println("读取数据错误或者空数据:", err)
			break
		}
		recvStr := string(buf[:n])
		fmt.Println("收到client端发来的数据：", recvStr)
		//conn.Write([]byte(recvStr)) // 发送数据
	}
}
